﻿package zf.data.ds
{
	import zf.data.ds.node.DListNode;

	/**
	 * 双向链表指针类，实现指针的移动操作 
	 * @author Mike.zhang
	 * @langversion 3.0 
	 * @playerversion Flash 9 
	 * @see DLinkedList
	 */
	public class DListPointer
	{
		private var _node:DListNode;
		private var _list:DLinkedList;

		/**
		 * 创建一个双向链表指针 
		 * @param list 要指向的双向链表
		 * @param node 要指向的节点
		 * 
		 */
		public function DListPointer (list:DLinkedList,node:DListNode=null)
		{
			this._list=list;
			this._node=node;
		}
		/**
		 * 移动指针到第一个元素
		 * 
		 */
		public function first ():void
		{
			node=list.head;
		}
		/**
		 * 移动指针到最后一个元素
		 * 
		 */
		public function last ():void
		{
			node=list.tail;
		}
		/**
		 * 如果有移动指针到上一个元素，否则不移动 
		 * 
		 */
		public function back ():void
		{
			if (hasPrev())
			{
				node=node.prev;
			}
		}
		/**
		 * 如果有移动指针到下一个元素，否则不移动 
		 * 
		 */
		public function next ():void
		{
			if (hasNext())
			{
				node=node.next;
			}
		}
		/**
		 * 检测指针上一个元素是否存在，存在返回true 
		 * @return 有则返回true
		 * 
		 */
		public function hasPrev ():Boolean
		{
			return Boolean(node.prev);
		}
		/**
		 * 检测指针下一个元素是否存在，存在返回true 
		 * @return 有则返回true
		 * 
		 */
		public function hasNext ():Boolean
		{
			return Boolean(node.next);
		}
		/**
		 * 获取指针所指向的节点，你可以使用 node.data 访问节点的数据 
		 * @return 节点
		 * 
		 */
		public function get node ():DListNode
		{
			return _node;
		}
		public function set node (v:DListNode):void
		{
			_node=v;
		}
		/**
		 * 获取指针所在的链表 
		 * @return 链表
		 * 
		 */
		public function get list ():DLinkedList
		{
			return _list;
		}
		public function set list (v:DLinkedList):void
		{
			_list=v;
		}
		public function remove ():Boolean
		{
			return list.remove(this);
		}
		/**
		 * 返回指针的描述 
		 * @return 其格式为[ DListPointer data] 
		 * 
		 */
		public function toString ():String
		{
			return "[ DListPointer " + node.toString() + "]";
		}
	}
}